performance.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { useParams } from 'common'
  2. import { useMemo, useState } from 'react'
  3. import { LoadingLine } from 'ui'
  4. import { LINTER_LEVELS } from '@/components/interfaces/Linter/Linter.constants'
  5. import { lintInfoMap } from '@/components/interfaces/Linter/Linter.utils'
  6. import { LinterDataGrid } from '@/components/interfaces/Linter/LinterDataGrid'
  7. import LinterFilters from '@/components/interfaces/Linter/LinterFilters'
  8. import { LinterPageFooter } from '@/components/interfaces/Linter/LinterPageFooter'
  9. import LintPageTabs from '@/components/interfaces/Linter/LintPageTabs'
  10. import AdvisorsLayout from '@/components/layouts/AdvisorsLayout/AdvisorsLayout'
  11. import { DefaultLayout } from '@/components/layouts/DefaultLayout'
  12. import { FormHeader } from '@/components/ui/Forms/FormHeader'
  13. import { Lint, useProjectLintsQuery } from '@/data/lint/lint-query'
  14. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  15. import { DOCS_URL } from '@/lib/constants'
  16. import type { NextPageWithLayout } from '@/types'
  17. const ProjectLints: NextPageWithLayout = () => {
  18. const { preset, id } = useParams()
  19. const { data: project } = useSelectedProjectQuery()
  20. // need to maintain a list of filters for each tab
  21. const [filters, setFilters] = useState<{ level: LINTER_LEVELS; filters: string[] }[]>([
  22. { level: LINTER_LEVELS.ERROR, filters: [] },
  23. { level: LINTER_LEVELS.WARN, filters: [] },
  24. { level: LINTER_LEVELS.INFO, filters: [] },
  25. ])
  26. const [currentTab, setCurrentTab] = useState<LINTER_LEVELS>(
  27. (preset as LINTER_LEVELS) ?? LINTER_LEVELS.ERROR
  28. )
  29. const {
  30. data,
  31. isPending: isLoading,
  32. isRefetching,
  33. refetch,
  34. } = useProjectLintsQuery({
  35. projectRef: project?.ref,
  36. })
  37. const activeLints = useMemo(() => {
  38. return [...(data ?? [])]?.filter((x) => x.categories.includes('PERFORMANCE'))
  39. }, [data])
  40. const currentTabFilters = (filters.find((filter) => filter.level === currentTab)?.filters ||
  41. []) as string[]
  42. const filteredLints = activeLints
  43. .filter((x) => x.level === currentTab)
  44. .filter((x) => (currentTabFilters.length > 0 ? currentTabFilters.includes(x.name) : x))
  45. const filterOptions = lintInfoMap
  46. // only show filters for lint types which are present in the results and not ignored
  47. .filter((item) =>
  48. activeLints.some((lint) => lint.name === item.name && lint.level === currentTab)
  49. )
  50. .map((type) => ({
  51. name: type.title,
  52. value: type.name,
  53. }))
  54. const selectedLint: Lint | null = useMemo(() => {
  55. return activeLints.find((lint) => lint.cache_key === id) ?? null
  56. }, [id, activeLints])
  57. return (
  58. <div className="h-full flex flex-col">
  59. <FormHeader
  60. className="py-4 px-6 mb-0!"
  61. title="Performance Advisor"
  62. docsUrl={`${DOCS_URL}/guides/database/database-linter`}
  63. />
  64. <LintPageTabs
  65. activeLints={activeLints}
  66. isLoading={isLoading}
  67. currentTab={currentTab}
  68. setCurrentTab={setCurrentTab}
  69. />
  70. <LinterFilters
  71. filterOptions={filterOptions}
  72. activeLints={activeLints}
  73. filteredLints={filteredLints}
  74. currentTab={currentTab}
  75. filters={filters}
  76. isLoading={isLoading || isRefetching}
  77. setFilters={setFilters}
  78. onClickRefresh={refetch}
  79. />
  80. <LoadingLine loading={isRefetching} />
  81. <LinterDataGrid
  82. filteredLints={filteredLints}
  83. currentTab={currentTab}
  84. selectedLint={selectedLint}
  85. isLoading={isLoading}
  86. />
  87. <LinterPageFooter isLoading={isLoading} isRefetching={isRefetching} refetch={refetch} />
  88. </div>
  89. )
  90. }
  91. ProjectLints.getLayout = (page) => (
  92. <DefaultLayout>
  93. <AdvisorsLayout title="Linter">{page}</AdvisorsLayout>
  94. </DefaultLayout>
  95. )
  96. export default ProjectLints